package com.ztf.ai.ticket;

import org.springframework.ai.chat.client.ChatClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

@Service
public class TicketOrderService {

    private final RedisTemplate<String, Object> redisTemplate;
    private final ChatClient chatClient; // 调用Qwen2.5处理验证码
    private final int maxRetry; // 最大重试次数（从配置获取）

    public TicketOrderService(
            RedisTemplate<String, Object> redisTemplate,
            ChatClient.Builder chatClientBuilder,
            @Value("${ticket.query.max-retry}") int maxRetry
    ) {
        this.redisTemplate = redisTemplate;
        this.chatClient = chatClientBuilder.build();
        this.maxRetry = maxRetry;
    }

    /**
     * 提交订单（带重试机制）
     */
    public void submitOrder(TicketTaskDTO taskDTO, TicketInventoryDTO inventory, int retryCount) {
        // 1. 校验重试次数，超过上限则标记任务失败
        if (retryCount > maxRetry) {
            updateTaskStatus(taskDTO.getTaskId(), "FAILED");
            updateTaskLog(taskDTO.getTaskId(), "下单重试次数超过上限，任务失败");
            return;
        }
        try {
            // 2. 从Redis获取用户预设信息（解密）
            UserPresetInfoDTO userInfo = getDecryptedUserInfo(taskDTO.getUserId());
            if (userInfo == null) {
                throw new RuntimeException("用户预设信息缺失，无法下单");
            }
            // 3. 处理验证码（若有）：调用Qwen2.5识别图文验证码
            // String verificationCode = handleVerificationCode();
            String verificationCode = "1234";
            // 4. 提交订单（模拟调用票务接口）
            boolean orderSuccess = callSubmitOrderApi(taskDTO, userInfo, verificationCode, inventory);
            if (orderSuccess) {
                // 下单成功：更新状态并发送通知
                updateTaskStatus(taskDTO.getTaskId(), "SUCCESS");
                updateTaskLog(taskDTO.getTaskId(), "抢票成功！订单号：" + generateOrderNo());
                sendNotify(taskDTO.getUserId(), "抢票成功，车次：" + taskDTO.getTrainNo());
            } else {
                // 下单失败：重试（递归调用，重试次数+1）
                updateTaskLog(taskDTO.getTaskId(), "下单失败，正在重试（第" + (retryCount + 1) + "次）");
                submitOrder(taskDTO, inventory, retryCount + 1);
            }
        } catch (Exception e) {
            // 异常重试
            updateTaskLog(taskDTO.getTaskId(), "下单异常：" + e.getMessage() + "，重试（第" + (retryCount + 1) + "次）");
            submitOrder(taskDTO, inventory, retryCount + 1);
        }
    }

    // 解密用户信息（模拟，实际需用对称加密算法解密）
    private UserPresetInfoDTO getDecryptedUserInfo(String userId) {
        String encryptedInfo = (String) redisTemplate.opsForValue().get("USER_INFO_" + userId);
        // 模拟解密逻辑（实际需替换为AES/DES等算法）
        return new UserPresetInfoDTO() {{
            setRealName("张三");
            setIdCard("110101********1234");
            setPhone("138****8888");
        }};
    }

    // 调用Qwen2.5识别验证码（模拟图文验证码场景）
    private String handleVerificationCode() {
        // 模拟验证码图片Base64（实际需从票务接口获取）
        String captchaBase64 = "";
        String prompt = "请识别以下Base64图片中的验证码（4位数字/字母），仅返回结果：" + captchaBase64;
        return chatClient.prompt(prompt).call().content();
    }

    // 模拟提交订单接口
    private boolean callSubmitOrderApi(TicketTaskDTO taskDTO, UserPresetInfoDTO userInfo,
                                       String verificationCode, TicketInventoryDTO inventory) {
        // 实际需对接票务平台的下单接口，此处模拟“下单成功”
        return "1234".equals(verificationCode); // 假设验证码正确则下单成功
    }

    // 生成随机订单号
    private String generateOrderNo() {
        return "OD" + System.currentTimeMillis() + (int) (Math.random() * 1000);
    }

    // 发送抢票结果通知（模拟短信/站内信）
    private void sendNotify(String userId, String content) {
        System.out.println("向用户" + userId + "发送通知：" + content);
        // 实际可集成短信接口（如阿里云短信服务）或推送服务
    }

    // 辅助方法：获取任务状态（Redis存储）
    private String getTaskStatus(String taskId) {
        return (String) redisTemplate.opsForValue().get("TICKET_TASK_STATUS_" + taskId);
    }

    // 辅助方法：更新任务状态
    private void updateTaskStatus(String taskId, String status) {
        redisTemplate.opsForValue().set("TICKET_TASK_STATUS_" + taskId, status);
    }

    // 辅助方法：更新任务日志
    private void updateTaskLog(String taskId, String log) {
        redisTemplate.opsForList().rightPush("TICKET_TASK_LOG_" + taskId, log);
    }
}